#ifndef LSTACK_H_INCLUDED
#define LSTACK_H_INCLUDED

#include <stdio.h>
#include <malloc.h>

typedef struct snode
{
    char data;
    struct snode *next;
};
typedef struct snode snode;
typedef struct snode *sll; // sll指的是StackLinkList

/*
void Sinitiate(sll sh) // sh指的是StackHead
{
    sh = (sll)malloc(sizeof(snode));
    sh->next = nullptr;
}
*/

/*****利用头插法，将字符串存储进链表中，形成堆栈，然后可以逐次处理头结点*****/
void Spush(sll sh, char c)
{
    sll p;                          // 声明一个新的结点，用于存储字符以及指向该字符的指针
    p = (sll)malloc(sizeof(snode)); // 分配存储空间
    p->data = c;                    // 赋值
    p->next = sh->next;             // 把头结点下一个结点的地址赋给p的指针域
    sh->next = p;                   // 把p的地址赋给头结点的指针域
}
/*****利用头插法，将字符串存储进链表中，形成堆栈，然后可以逐次处理头结点*****/

/*****弹出除了头结点以外的第一个结点*****/
char Spop(sll sh)
{
    if (sh->next == nullptr)
    {
        printf("堆栈已空！\n");
        return '\0';
    }
    else
    {
        sll p = sh->next;   // p表示需要弹出的栈顶结点
        sh->next = p->next; // 头结点指向新的栈顶结点
        return p->data;     // 返回元栈顶结点存储的字符
    }
}
/*****弹出除了头结点以外的第一个结点*****/

void prints(sll sh)
{
    sll p = sh->next;
    while (p != nullptr)
    {
        printf("%c", p->data);
        p = p->next;
    }
    free(p);
}

#endif